﻿using System;
using System.Runtime.InteropServices;

namespace DataService.Structs;

[StructLayout(LayoutKind.Explicit, Size = 4)]
public struct Storage
{
    // Fields
    [FieldOffset(0)]
    public bool Boolean;
    [FieldOffset(0)]
    public byte Byte;
    [FieldOffset(0)]
    public short Int16;
    [FieldOffset(0)]
    public int Int32;
    [FieldOffset(0)]
    public float Single;
    [FieldOffset(0)]
    public ushort Word;
    [FieldOffset(0)]
    public uint DWord;

    public static readonly Storage Empty;

    static Storage()
    {
        Empty = new Storage();
    }

    public override bool Equals(object obj)
    {
        if (obj == null) return false;
        Type type = obj.GetType();
        if (type == typeof(Storage))
            return Int32 == ((Storage)obj).Int32;
        else
        {
            if (type == typeof(int))
                return Int32 == (int)obj;
            if (type == typeof(short))
                return Int16 == (short)obj;
            if (type == typeof(byte))
                return Byte == (byte)obj;
            if (type == typeof(bool))
                return Boolean == (bool)obj;
            if (type == typeof(float))
                return Single == (float)obj;
            if (type == typeof(ushort))
                return Word == (ushort)obj;
            if (type == typeof(uint))
                return DWord == (uint)obj;
            if (type == typeof(string))
                return ToString() == obj.ToString();
        }
        return false;
    }

    public override int GetHashCode()
    {
        return Int32.GetHashCode();
    }

    public static bool operator ==(Storage x, Storage y)
    {
        return x.Int32 == y.Int32;
    }

    public static bool operator !=(Storage x, Storage y)
    {
        return x.Int32 != y.Int32;
    }
}